]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
environment: Handle reversed transition with 0 duration
authorFlorian Müllner <fmuellner@gnome.org>
Sat, 22 Feb 2020 15:35:32 +0000 (16:35 +0100)
committerCarlos Garnacho <mrgarnacho@gmail.com>
Tue, 25 Feb 2020 18:08:47 +0000 (18:08 +0000)
If a transition is reversed, the final property values will be the
same as before the transition. However this currently only works
correctly when we actually use a transition; to fix this with a
duration of 0, simply skip the set() call when the transition is
reversed.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/1042

js/ui/environment.js

index 31440ea2a646d47fb14e8e8b9874f18134dc3a14..ba378e7d113496eda175dde300c3bf158b6d6dec 100644 (file)
@@ -111,6 +111,11 @@ function _easeActor(actor, params) {
         autoReverse = params.autoReverse;
     delete params.autoReverse;
 
+    // repeatCount doesn't include the initial iteration
+    const numIterations = repeatCount + 1;
+    // whether the transition should finish where it started
+    const isReversed = autoReverse && numIterations % 2 === 0;
+
     if (params.mode != undefined)
         actor.set_easing_mode(params.mode);
     delete params.mode;
@@ -122,7 +127,8 @@ function _easeActor(actor, params) {
     let animatedProps = Object.keys(params).map(p => p.replace('_', '-', 'g'));
     animatedProps.forEach(p => actor.remove_transition(p));
 
-    actor.set(params);
+    if (actor.get_easing_duration() > 0 || !isReversed)
+        actor.set(params);
     actor.restore_easing_state();
 
     let transition = animatedProps.map(p => actor.get_transition(p))
@@ -161,6 +167,11 @@ function _easeActorProperty(actor, propName, target, params) {
         autoReverse = params.autoReverse;
     delete params.autoReverse;
 
+    // repeatCount doesn't include the initial iteration
+    const numIterations = repeatCount + 1;
+    // whether the transition should finish where it started
+    const isReversed = autoReverse && numIterations % 2 === 0;
+
     // Copy Clutter's behavior for implicit animations, see
     // should_skip_implicit_transition()
     if (actor instanceof Clutter.Actor && !actor.mapped)
@@ -174,7 +185,9 @@ function _easeActorProperty(actor, propName, target, params) {
 
     if (duration == 0) {
         let [obj, prop] = _getPropertyTarget(actor, propName);
-        obj[prop] = target;
+
+        if (!isReversed)
+            obj[prop] = target;
 
         Meta.disable_unredirect_for_display(global.display);
         callback(true);